package myjava.patterns.singleton;

public class Root {

   public static void main(String[] args) {

      // OnlyOnce O0 = new OnlyOnce(); // cannot work cuz the constructor is private

      /* [!] il cotruttore (se pubblico) e' l'unico pezzo di codice che viene eseguito
      automaticamente all'istanziazione da un contesto PUBBLICO. Se il costruttore
      e' privato chiaramente non compila un cazzo! */
      Singleton O1 = Singleton.getInstance();
      Singleton O2 = Singleton.getInstance();
      Singleton O3 = Singleton.getInstance();
      Singleton O4 = Singleton.getInstance();
      System.out.println("numero di istanze: " + Singleton.n); // should be 1 ;-)
   }
}

class Singleton {

   // var statica in cui salvo l'istanza stessa (if any!)
   private static Singleton instance = null;
   public static int n = 0;

   // metodo statico che accede ed esegue il costruttore privato (non visibile da fuori!!!)
   // solo nel caso in un cui l'oggetto non sia stato istanziato already
   public static Singleton getInstance() {
      if (Singleton.instance == null) {
         Singleton.instance = new Singleton();
      }
      return instance;
   }

   // costruttore privato che incrementa il contatore n
   private Singleton() {
      System.out.println("costruttore eseguito!");
      Singleton.n++;
   }
}